home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume5 / z80ad / part02 < prev    next >
Encoding:
Internet Message Format  |  1989-02-03  |  48.2 KB

  1. Path: xanth!nic.MR.NET!hal!ncoast!allbery
  2. From: bownesrm@beowulf.UUCP (Keptin Comrade Dr. Bob)
  3. Newsgroups: comp.sources.misc
  4. Subject: v05i087: Z80 Assembler/Disassembler part 2 of 3
  5. Message-ID: <1125@beowulf.UUCP>
  6. Date: 19 Dec 88 01:08:51 GMT
  7. Sender: allbery@ncoast.UUCP
  8. Reply-To: bownesrm@beowulf.UUCP (Keptin Comrade Dr. Bob)
  9. Organization: Reality Central
  10. Lines: 2439
  11. Approved: allbery@ncoast.UUCP
  12.  
  13. Posting-number: Volume 5, Issue 87
  14. Submitted-by: "Keptin Comrade Dr. Bob" <bownesrm@beowulf.UUCP>
  15. Archive-name: z80ad/part02
  16.  
  17. #!/bin/sh
  18. # this is part 2 of an archive
  19. # do not concatenate these parts, unpack them in order with /bin/sh
  20. # file zmac/zdis.c continued
  21. #
  22. CurArch=2
  23. if test ! -r ._seq_
  24. then echo "Please unpack part 1 first!"
  25.      exit 1; fi
  26. ( read Scheck
  27.   if test "$Scheck" != $CurArch
  28.   then echo "Please unpack part $Scheck next!"
  29.        exit 1;
  30.   else exit 0; fi
  31. ) < ._seq_ || exit 1
  32. sed 's/^X//' << 'SHAR_EOF' >> zmac/zdis.c
  33. X    undefined,        0,        /* ddf3 */
  34. X    undefined,        0,        /* ddf4 */
  35. X    undefined,        0,        /* ddf5 */
  36. X    undefined,        0,        /* ddf6 */
  37. X    undefined,        0,        /* ddf7 */
  38. X
  39. X    undefined,        0,        /* ddf8 */
  40. X    "ld    sp,ix",        0,        /* ddf9 */
  41. X    undefined,        0,        /* ddfa */
  42. X    undefined,        0,        /* ddfb */
  43. X    undefined,        0,        /* ddfc */
  44. X    undefined,        0,        /* ddfd */
  45. X    undefined,        0,        /* ddfe */
  46. X    undefined,        0,        /* ddff */
  47. X                            /* ed */
  48. X    undefined,        0,        /* ed00 */
  49. X    undefined,        0,        /* ed01 */
  50. X    undefined,        0,        /* ed02 */
  51. X    undefined,        0,        /* ed03 */
  52. X    undefined,        0,        /* ed04 */
  53. X    undefined,        0,        /* ed05 */
  54. X    undefined,        0,        /* ed06 */
  55. X    undefined,        0,        /* ed07 */
  56. X
  57. X    undefined,        0,        /* ed08 */
  58. X    undefined,        0,        /* ed09 */
  59. X    undefined,        0,        /* ed0a */
  60. X    undefined,        0,        /* ed0b */
  61. X    undefined,        0,        /* ed0c */
  62. X    undefined,        0,        /* ed0d */
  63. X    undefined,        0,        /* ed0e */
  64. X    undefined,        0,        /* ed0f */
  65. X
  66. X    undefined,        0,        /* ed10 */
  67. X    undefined,        0,        /* ed11 */
  68. X    undefined,        0,        /* ed12 */
  69. X    undefined,        0,        /* ed13 */
  70. X    undefined,        0,        /* ed14 */
  71. X    undefined,        0,        /* ed15 */
  72. X    undefined,        0,        /* ed16 */
  73. X    undefined,        0,        /* ed17 */
  74. X
  75. X    undefined,        0,        /* ed18 */
  76. X    undefined,        0,        /* ed19 */
  77. X    undefined,        0,        /* ed1a */
  78. X    undefined,        0,        /* ed1b */
  79. X    undefined,        0,        /* ed1c */
  80. X    undefined,        0,        /* ed1d */
  81. X    undefined,        0,        /* ed1e */
  82. X    undefined,        0,        /* ed1f */
  83. X
  84. X    undefined,        0,        /* ed20 */
  85. X    undefined,        0,        /* ed21 */
  86. X    undefined,        0,        /* ed22 */
  87. X    undefined,        0,        /* ed23 */
  88. X    undefined,        0,        /* ed24 */
  89. X    undefined,        0,        /* ed25 */
  90. X    undefined,        0,        /* ed26 */
  91. X    undefined,        0,        /* ed27 */
  92. X
  93. X    undefined,        0,        /* ed28 */
  94. X    undefined,        0,        /* ed29 */
  95. X    undefined,        0,        /* ed2a */
  96. X    undefined,        0,        /* ed2b */
  97. X    undefined,        0,        /* ed2c */
  98. X    undefined,        0,        /* ed2d */
  99. X    undefined,        0,        /* ed2e */
  100. X    undefined,        0,        /* ed2f */
  101. X
  102. X    undefined,        0,        /* ed30 */
  103. X    undefined,        0,        /* ed31 */
  104. X    undefined,        0,        /* ed32 */
  105. X    undefined,        0,        /* ed33 */
  106. X    undefined,        0,        /* ed34 */
  107. X    undefined,        0,        /* ed35 */
  108. X    undefined,        0,        /* ed36 */
  109. X    undefined,        0,        /* ed37 */
  110. X
  111. X    undefined,        0,        /* ed38 */
  112. X    undefined,        0,        /* ed39 */
  113. X    undefined,        0,        /* ed3a */
  114. X    undefined,        0,        /* ed3b */
  115. X    undefined,        0,        /* ed3c */
  116. X    undefined,        0,        /* ed3d */
  117. X    undefined,        0,        /* ed3e */
  118. X    undefined,        0,        /* ed3f */
  119. X
  120. X    "in    b,(c)",        0,        /* ed40 */
  121. X    "out    (c),b",        0,        /* ed41 */
  122. X    "sbc    hl,bc",        0,        /* ed42 */
  123. X    "ld    (%02x%02xh),bc",2,        /* ed43 */
  124. X    "neg",            0,        /* ed44 */
  125. X    "retn",            0,        /* ed45 */
  126. X    "im    0",        0,        /* ed46 */
  127. X    "ld    i,a",        0,        /* ed47 */
  128. X    
  129. X    "in    c,(c)",        0,        /* ed48 */
  130. X    "out    (c),c",        0,        /* ed49 */
  131. X    "adc    hl,bc",        0,        /* ed4a */
  132. X    "ld    bc,(%02x%02xh)",2,        /* ed4b */
  133. X    undefined,        0,        /* ed4c */
  134. X    "reti",            0,        /* ed4d */
  135. X    undefined,        0,        /* ed4e */
  136. X    undefined,        0,        /* ed4f */
  137. X
  138. X    "in    d,(c)",        0,        /* ed50 */
  139. X    "out    (c),d",        0,        /* ed51 */
  140. X    "sbc    hl,de",        0,        /* ed52 */
  141. X    "ld    (%02x%02xh),de",2,        /* ed53 */
  142. X    undefined,        0,        /* ed54 */
  143. X    undefined,        0,        /* ed55 */
  144. X    "im    1",        0,        /* ed56 */
  145. X    "ld    a,i",        0,        /* ed57 */
  146. X
  147. X    "in    e,(c)",        0,        /* ed58 */
  148. X    "out    (c),e",        0,        /* ed59 */
  149. X    "adc    hl,de",        0,        /* ed5a */
  150. X    "ld    de,(%02x%02xh)",2,        /* ed5b */
  151. X    undefined,        0,        /* ed5c */
  152. X    undefined,        0,        /* ed5d */
  153. X    "im    2",        0,        /* ed5e */
  154. X    undefined,        0,        /* ed5f */
  155. X
  156. X    "in    h,(c)",        0,        /* ed60 */
  157. X    "out    (c),h",        0,        /* ed61 */
  158. X    "sbc    hl,hl",        0,        /* ed62 */
  159. X    undefined,        0,        /* ed63 */
  160. X    undefined,        0,        /* ed64 */
  161. X    undefined,        0,        /* ed65 */
  162. X    undefined,        0,        /* ed66 */
  163. X    "rrd",            0,        /* ed67 */
  164. X
  165. X    "in    l,(c)",        0,        /* ed68 */
  166. X    "out    (c),l",        0,        /* ed69 */
  167. X    "adc    hl,hl",        0,        /* ed6a */
  168. X    undefined,        0,        /* ed6b */
  169. X    undefined,        0,        /* ed6c */
  170. X    undefined,        0,        /* ed6d */
  171. X    undefined,        0,        /* ed6e */
  172. X    "rld",            0,        /* ed6f */
  173. X    
  174. X    undefined,        0,        /* ed70 */
  175. X    undefined,        0,        /* ed71 */
  176. X    "sbc    hl,sp",        0,        /* ed72 */
  177. X    "ld    (%02x%02xh),sp",2,        /* ed73 */
  178. X    undefined,        0,        /* ed74 */
  179. X    undefined,        0,        /* ed75 */
  180. X    undefined,        0,        /* ed76 */
  181. X    undefined,        0,        /* ed77 */
  182. X
  183. X    "in    a,(c)",        0,        /* ed78 */
  184. X    "out    (c),a",        0,        /* ed79 */
  185. X    "adc    hl,sp",        0,        /* ed7a */
  186. X    "ld    sp,(%02x%02xh)",2,        /* ed7b */
  187. X    undefined,        0,        /* ed7c */
  188. X    undefined,        0,        /* ed7d */
  189. X    undefined,        0,        /* ed7e */
  190. X    undefined,        0,        /* ed7f */
  191. X
  192. X    undefined,        0,        /* ed80 */
  193. X    undefined,        0,        /* ed81 */
  194. X    undefined,        0,        /* ed82 */
  195. X    undefined,        0,        /* ed83 */
  196. X    undefined,        0,        /* ed84 */
  197. X    undefined,        0,        /* ed85 */
  198. X    undefined,        0,        /* ed86 */
  199. X    undefined,        0,        /* ed87 */
  200. X
  201. X    undefined,        0,        /* ed88 */
  202. X    undefined,        0,        /* ed89 */
  203. X    undefined,        0,        /* ed8a */
  204. X    undefined,        0,        /* ed8b */
  205. X    undefined,        0,        /* ed8c */
  206. X    undefined,        0,        /* ed8d */
  207. X    undefined,        0,        /* ed8e */
  208. X    undefined,        0,        /* ed8f */
  209. X
  210. X    undefined,        0,        /* ed90 */
  211. X    undefined,        0,        /* ed91 */
  212. X    undefined,        0,        /* ed92 */
  213. X    undefined,        0,        /* ed93 */
  214. X    undefined,        0,        /* ed94 */
  215. X    undefined,        0,        /* ed95 */
  216. X    undefined,        0,        /* ed96 */
  217. X    undefined,        0,        /* ed97 */
  218. X
  219. X    undefined,        0,        /* ed98 */
  220. X    undefined,        0,        /* ed99 */
  221. X    undefined,        0,        /* ed9a */
  222. X    undefined,        0,        /* ed9b */
  223. X    undefined,        0,        /* ed9c */
  224. X    undefined,        0,        /* ed9d */
  225. X    undefined,        0,        /* ed9e */
  226. X    undefined,        0,        /* ed9f */
  227. X
  228. X    "ldi",            0,        /* eda0 */
  229. X    "cpi",            0,        /* eda1 */
  230. X    "ini",            0,        /* eda2 */
  231. X    "outi",            0,        /* eda3 */
  232. X    undefined,        0,        /* eda4 */
  233. X    undefined,        0,        /* eda5 */
  234. X    undefined,        0,        /* eda6 */
  235. X    undefined,        0,        /* eda7 */
  236. X
  237. X    "ldd",            0,        /* eda8 */
  238. X    "cpd",            0,        /* eda9 */
  239. X    "ind",            0,        /* edaa */
  240. X    "outd",            0,        /* edab */
  241. X    undefined,        0,        /* edac */
  242. X    undefined,        0,        /* edad */
  243. X    undefined,        0,        /* edae */
  244. X    undefined,        0,        /* edaf */
  245. X
  246. X    "ldir",            0,        /* edb0 */
  247. X    "cpir",            0,        /* edb1 */
  248. X    "inir",            0,        /* edb2 */
  249. X    "otir",            0,        /* edb3 */
  250. X    undefined,        0,        /* edb4 */
  251. X    undefined,        0,        /* edb5 */
  252. X    undefined,        0,        /* edb6 */
  253. X    undefined,        0,        /* edb7 */
  254. X
  255. X    "lddr",            0,        /* edb8 */
  256. X    "cpdr",            0,        /* edb9 */
  257. X    "indr",            0,        /* edba */
  258. X    "otdr",            0,        /* edbb */
  259. X    undefined,        0,        /* edbc */
  260. X    undefined,        0,        /* edbd */
  261. X    undefined,        0,        /* edbe */
  262. X    undefined,        0,        /* edbf */
  263. X
  264. X    undefined,        0,        /* edc0 */
  265. X    undefined,        0,        /* edc1 */
  266. X    undefined,        0,        /* edc2 */
  267. X    undefined,        0,        /* edc3 */
  268. X    undefined,        0,        /* edc4 */
  269. X    undefined,        0,        /* edc5 */
  270. X    undefined,        0,        /* edc6 */
  271. X    undefined,        0,        /* edc7 */
  272. X
  273. X    undefined,        0,        /* edc8 */
  274. X    undefined,        0,        /* edc9 */
  275. X    undefined,        0,        /* edca */
  276. X    undefined,        0,        /* edcb */
  277. X    undefined,        0,        /* edcc */
  278. X    undefined,        0,        /* edcd */
  279. X    undefined,        0,        /* edce */
  280. X    undefined,        0,        /* edcf */
  281. X
  282. X    undefined,        0,        /* edd0 */
  283. X    undefined,        0,        /* edd1 */
  284. X    undefined,        0,        /* edd2 */
  285. X    undefined,        0,        /* edd3 */
  286. X    undefined,        0,        /* edd4 */
  287. X    undefined,        0,        /* edd5 */
  288. X    undefined,        0,        /* edd6 */
  289. X    undefined,        0,        /* edd7 */
  290. X
  291. X    undefined,        0,        /* edd8 */
  292. X    undefined,        0,        /* edd9 */
  293. X    undefined,        0,        /* edda */
  294. X    undefined,        0,        /* eddb */
  295. X    undefined,        0,        /* eddc */
  296. X    undefined,        0,        /* eddd */
  297. X    undefined,        0,        /* edde */
  298. X    undefined,        0,        /* eddf */
  299. X
  300. X    undefined,        0,        /* ede0 */
  301. X    undefined,        0,        /* ede1 */
  302. X    undefined,        0,        /* ede2 */
  303. X    undefined,        0,        /* ede3 */
  304. X    undefined,        0,        /* ede4 */
  305. X    undefined,        0,        /* ede5 */
  306. X    undefined,        0,        /* ede6 */
  307. X    undefined,        0,        /* ede7 */
  308. X
  309. X    undefined,        0,        /* ede8 */
  310. X    undefined,        0,        /* ede9 */
  311. X    undefined,        0,        /* edea */
  312. X    undefined,        0,        /* edeb */
  313. X    undefined,        0,        /* edec */
  314. X    undefined,        0,        /* eded */
  315. X    undefined,        0,        /* edee */
  316. X    undefined,        0,        /* edef */
  317. X
  318. X    undefined,        0,        /* edf0 */
  319. X    undefined,        0,        /* edf1 */
  320. X    undefined,        0,        /* edf2 */
  321. X    undefined,        0,        /* edf3 */
  322. X    undefined,        0,        /* edf4 */
  323. X    undefined,        0,        /* edf5 */
  324. X    undefined,        0,        /* edf6 */
  325. X    undefined,        0,        /* edf7 */
  326. X
  327. X    undefined,        0,        /* edf8 */
  328. X    undefined,        0,        /* edf9 */
  329. X    undefined,        0,        /* edfa */
  330. X    undefined,        0,        /* edfb */
  331. X    undefined,        0,        /* edfc */
  332. X    undefined,        0,        /* edfd */
  333. X    undefined,        0,        /* edfe */
  334. X    undefined,        0,        /* edff */
  335. X                            /* fd */
  336. X    undefined,        0,        /* fd00 */
  337. X    undefined,        0,        /* fd01 */
  338. X    undefined,        0,        /* fd02 */
  339. X    undefined,        0,        /* fd03 */
  340. X    undefined,        0,        /* fd04 */
  341. X    undefined,        0,        /* fd05 */
  342. X    undefined,        0,        /* fd06 */
  343. X    undefined,        0,        /* fd07 */
  344. X
  345. X    undefined,        0,        /* fd08 */
  346. X    "add    iy,bc",        0,        /* fd09 */
  347. X    undefined,        0,        /* fd0a */
  348. X    undefined,        0,        /* fd0b */
  349. X    undefined,        0,        /* fd0c */
  350. X    undefined,        0,        /* fd0d */
  351. X    undefined,        0,        /* fd0e */
  352. X    undefined,        0,        /* fd0f */
  353. X
  354. X    undefined,        0,        /* fd10 */
  355. X    undefined,        0,        /* fd11 */
  356. X    undefined,        0,        /* fd12 */
  357. X    undefined,        0,        /* fd13 */
  358. X    undefined,        0,        /* fd14 */
  359. X    undefined,        0,        /* fd15 */
  360. X    undefined,        0,        /* fd16 */
  361. X    undefined,        0,        /* fd17 */
  362. X
  363. X    undefined,        0,        /* fd18 */
  364. X    "add    iy,de",        0,        /* fd19 */
  365. X    undefined,        0,        /* fd1a */
  366. X    undefined,        0,        /* fd1b */
  367. X    undefined,        0,        /* fd1c */
  368. X    undefined,        0,        /* fd1d */
  369. X    undefined,        0,        /* fd1e */
  370. X    undefined,        0,        /* fd1f */
  371. X
  372. X    undefined,        0,        /* fd20 */
  373. X    "ld    iy,%02x%02xh",    2,        /* fd21 */
  374. X    "ld    (%02x%02xh),iy",2,        /* fd22 */
  375. X    "inc    iy",        0,        /* fd23 */
  376. X    undefined,        0,        /* fd24 */
  377. X    undefined,        0,        /* fd25 */
  378. X    undefined,        0,        /* fd26 */
  379. X    undefined,        0,        /* fd27 */
  380. X
  381. X    undefined,        0,        /* fd28 */
  382. X    "add    iy,iy",        0,        /* fd29 */
  383. X    "ld    iy,(%02x%02xh)",2,        /* fd2a */
  384. X    "dec    iy",        0,        /* fd2b */
  385. X    undefined,        0,        /* fd2c */
  386. X    undefined,        0,        /* fd2d */
  387. X    undefined,        0,        /* fd2e */
  388. X    undefined,        0,        /* fd2f */
  389. X
  390. X    undefined,        0,        /* fd30 */
  391. X    undefined,        0,        /* fd31 */
  392. X    undefined,        0,        /* fd32 */
  393. X    undefined,        0,        /* fd33 */
  394. X    "inc    (iy+%02xh)",    1,        /* fd34 */
  395. X    "dec    (iy+%02xh)",    1,        /* fd35 */
  396. X    "ld    (iy+%02xh),%02xh",2,        /* fd36 */
  397. X    undefined,        0,        /* fd37 */
  398. X
  399. X    undefined,        0,        /* fd38 */
  400. X    "add    iy,sp",        0,        /* fd39 */
  401. X    undefined,        0,        /* fd3a */
  402. X    undefined,        0,        /* fd3b */
  403. X    undefined,        0,        /* fd3c */
  404. X    undefined,        0,        /* fd3d */
  405. X    undefined,        0,        /* fd3e */
  406. X    undefined,        0,        /* fd3f */
  407. X
  408. X    undefined,        0,        /* fd40 */
  409. X    undefined,        0,        /* fd41 */
  410. X    undefined,        0,        /* fd42 */
  411. X    undefined,        0,        /* fd43 */
  412. X    undefined,        0,        /* fd44 */
  413. X    undefined,        0,        /* fd45 */
  414. X    "ld    b,(iy+%02xh)",    1,        /* fd46 */
  415. X    undefined,        0,        /* fd47 */
  416. X
  417. X    undefined,        0,        /* fd48 */
  418. X    undefined,        0,        /* fd49 */
  419. X    undefined,        0,        /* fd4a */
  420. X    undefined,        0,        /* fd4b */
  421. X    undefined,        0,        /* fd4c */
  422. X    undefined,        0,        /* fd4d */
  423. X    "ld    c,(iy+%02xh)",    1,        /* fd4e */
  424. X    undefined,        0,        /* fd4f */
  425. X    
  426. X    undefined,        0,        /* fd50 */
  427. X    undefined,        0,        /* fd51 */
  428. X    undefined,        0,        /* fd52 */
  429. X    undefined,        0,        /* fd53 */
  430. X    undefined,        0,        /* fd54 */
  431. X    undefined,        0,        /* fd55 */
  432. X    "ld    d,(iy+%02xh)",    1,        /* fd56 */
  433. X    undefined,        0,        /* fd57 */
  434. X
  435. X    undefined,        0,        /* fd58 */
  436. X    undefined,        0,        /* fd59 */
  437. X    undefined,        0,        /* fd5a */
  438. X    undefined,        0,        /* fd5b */
  439. X    undefined,        0,        /* fd5c */
  440. X    undefined,        0,        /* fd5d */
  441. X    "ld    e,(iy+%02xh)",    1,        /* fd5e */
  442. X    undefined,        0,        /* fd5f */
  443. X    
  444. X    undefined,        0,        /* fd60 */
  445. X    undefined,        0,        /* fd61 */
  446. X    undefined,        0,        /* fd62 */
  447. X    undefined,        0,        /* fd63 */
  448. X    undefined,        0,        /* fd64 */
  449. X    undefined,        0,        /* fd65 */
  450. X    "ld    h,(iy+%02xh)",    1,        /* fd66 */
  451. X    undefined,        0,        /* fd67 */
  452. X
  453. X    undefined,        0,        /* fd68 */
  454. X    undefined,        0,        /* fd69 */
  455. X    undefined,        0,        /* fd6a */
  456. X    undefined,        0,        /* fd6b */
  457. X    undefined,        0,        /* fd6c */
  458. X    undefined,        0,        /* fd6d */
  459. X    "ld    l,(iy+%02xh)",    1,        /* fd6e */
  460. X    undefined,        0,        /* fd6f */
  461. X    
  462. X    "ld    (iy+%02xh),b",    1,        /* fd70 */
  463. X    "ld    (iy+%02xh),c",    1,        /* fd71 */
  464. X    "ld    (iy+%02xh),d",    1,        /* fd72 */
  465. X    "ld    (iy+%02xh),e",    1,        /* fd73 */
  466. X    "ld    (iy+%02xh),h",    1,        /* fd74 */
  467. X    "ld    (iy+%02xh),l",    1,        /* fd75 */
  468. X    undefined,        0,        /* fd76 */
  469. X    "ld    (iy+%02xh),a",    1,        /* fd77 */
  470. X
  471. X    undefined,        0,        /* fd78 */
  472. X    undefined,        0,        /* fd79 */
  473. X    undefined,        0,        /* fd7a */
  474. X    undefined,        0,        /* fd7b */
  475. X    undefined,        0,        /* fd7c */
  476. X    undefined,        0,        /* fd7d */
  477. X    "ld    a,(iy+%02xh)",    1,        /* fd7e */
  478. X    undefined,        0,        /* fd7f */
  479. X
  480. X    undefined,        0,        /* fd80 */
  481. X    undefined,        0,        /* fd81 */
  482. X    undefined,        0,        /* fd82 */
  483. X    undefined,        0,        /* fd83 */
  484. X    undefined,        0,        /* fd84 */
  485. X    undefined,        0,        /* fd85 */
  486. X    "add    a,(iy+%02xh)",    1,        /* fd86 */
  487. X    undefined,        0,        /* fd87 */
  488. X
  489. X    undefined,        0,        /* fd88 */
  490. X    undefined,        0,        /* fd89 */
  491. X    undefined,        0,        /* fd8a */
  492. X    undefined,        0,        /* fd8b */
  493. X    undefined,        0,        /* fd8c */
  494. X    undefined,        0,        /* fd8d */
  495. X    "adc    a,(iy+%02xh)",    1,        /* fd8e */
  496. X    undefined,        0,        /* fd8f */
  497. X    
  498. X    undefined,        0,        /* fd90 */
  499. X    undefined,        0,        /* fd91 */
  500. X    undefined,        0,        /* fd92 */
  501. X    undefined,        0,        /* fd93 */
  502. X    undefined,        0,        /* fd94 */
  503. X    undefined,        0,        /* fd95 */
  504. X    "sub    (iy+%02xh)",    1,        /* fd96 */
  505. X    undefined,        0,        /* fd97 */
  506. X
  507. X    undefined,        0,        /* fd98 */
  508. X    undefined,        0,        /* fd99 */
  509. X    undefined,        0,        /* fd9a */
  510. X    undefined,        0,        /* fd9b */
  511. X    undefined,        0,        /* fd9c */
  512. X    undefined,        0,        /* fd9d */
  513. X    "sbc    a,(iy+%02xh)",    1,        /* fd9e */
  514. X    undefined,        0,        /* fd9f */
  515. X    
  516. X    undefined,        0,        /* fda0 */
  517. X    undefined,        0,        /* fda1 */
  518. X    undefined,        0,        /* fda2 */
  519. X    undefined,        0,        /* fda3 */
  520. X    undefined,        0,        /* fda4 */
  521. X    undefined,        0,        /* fda5 */
  522. X    "and    (iy+%02xh)",    1,        /* fda6 */
  523. X    undefined,        0,        /* fda7 */
  524. X
  525. X    undefined,        0,        /* fda8 */
  526. X    undefined,        0,        /* fda9 */
  527. X    undefined,        0,        /* fdaa */
  528. X    undefined,        0,        /* fdab */
  529. X    undefined,        0,        /* fdac */
  530. X    undefined,        0,        /* fdad */
  531. X    "xor    (iy+%02xh)",    1,        /* fdae */
  532. X    undefined,        0,        /* fdaf */
  533. X    
  534. X    undefined,        0,        /* fdb0 */
  535. X    undefined,        0,        /* fdb1 */
  536. X    undefined,        0,        /* fdb2 */
  537. X    undefined,        0,        /* fdb3 */
  538. X    undefined,        0,        /* fdb4 */
  539. X    undefined,        0,        /* fdb5 */
  540. X    "or    (iy+%02xh)",    1,        /* fdb6 */
  541. X    undefined,        0,        /* fdb7 */
  542. X
  543. X    undefined,        0,        /* fdb8 */
  544. X    undefined,        0,        /* fdb9 */
  545. X    undefined,        0,        /* fdba */
  546. X    undefined,        0,        /* fdbb */
  547. X    undefined,        0,        /* fdbc */
  548. X    undefined,        0,        /* fdbd */
  549. X    "cp    (iy+%02xh)",    1,        /* fdbe */
  550. X    undefined,        0,        /* fdbf */
  551. X    
  552. X    undefined,        0,        /* fdc0 */
  553. X    undefined,        0,        /* fdc1 */
  554. X    undefined,        0,        /* fdc2 */
  555. X    undefined,        0,        /* fdc3 */
  556. X    undefined,        0,        /* fdc4 */
  557. X    undefined,        0,        /* fdc5 */
  558. X    undefined,        0,        /* fdc6 */
  559. X    undefined,        0,        /* fdc7 */
  560. X
  561. X    undefined,        0,        /* fdc8 */
  562. X    undefined,        0,        /* fdc9 */
  563. X    undefined,        0,        /* fdca */
  564. X    "fd cb    %02x,%02x",    2,        /* fdcb */
  565. X    undefined,        0,        /* fdcc */
  566. X    undefined,        0,        /* fdcd */
  567. X    undefined,        0,        /* fdce */
  568. X    undefined,        0,        /* fdcf */
  569. X    
  570. X    undefined,        0,        /* fdd0 */
  571. X    undefined,        0,        /* fdd1 */
  572. X    undefined,        0,        /* fdd2 */
  573. X    undefined,        0,        /* fdd3 */
  574. X    undefined,        0,        /* fdd4 */
  575. X    undefined,        0,        /* fdd5 */
  576. X    undefined,        0,        /* fdd6 */
  577. X    undefined,        0,        /* fdd7 */
  578. X
  579. X    undefined,        0,        /* fdd8 */
  580. X    undefined,        0,        /* fdd9 */
  581. X    undefined,        0,        /* fdda */
  582. X    undefined,        0,        /* fddb */
  583. X    undefined,        0,        /* fddc */
  584. X    undefined,        0,        /* fddd */
  585. X    undefined,        0,        /* fdde */
  586. X    undefined,        0,        /* fddf */
  587. X    
  588. X    undefined,        0,        /* fde0 */
  589. X    "pop    iy",        0,        /* fde1 */
  590. X    undefined,        0,        /* fde2 */
  591. X    "ex    (sp),iy",    0,        /* fde3 */
  592. X    undefined,        0,        /* fde4 */
  593. X    "push    iy",        0,        /* fde5 */
  594. X    undefined,        0,        /* fde6 */
  595. X    undefined,        0,        /* fde7 */
  596. X
  597. X    undefined,        0,        /* fde8 */
  598. X    "jp    (iy)",        0,        /* fde9 */
  599. X    undefined,        0,        /* fdea */
  600. X    undefined,        0,        /* fdeb */
  601. X    undefined,        0,        /* fdec */
  602. X    undefined,        0,        /* fded */
  603. X    undefined,        0,        /* fdee */
  604. X    undefined,        0,        /* fdef */
  605. X    
  606. X    undefined,        0,        /* fdf0 */
  607. X    undefined,        0,        /* fdf1 */
  608. X    undefined,        0,        /* fdf2 */
  609. X    undefined,        0,        /* fdf3 */
  610. X    undefined,        0,        /* fdf4 */
  611. X    undefined,        0,        /* fdf5 */
  612. X    undefined,        0,        /* fdf6 */
  613. X    undefined,        0,        /* fdf7 */
  614. X
  615. X    undefined,        0,        /* fdf8 */
  616. X    "ld    sp,iy",        0,        /* fdf9 */
  617. X    undefined,        0,        /* fdfa */
  618. X    undefined,        0,        /* fdfb */
  619. X    undefined,        0,        /* fdfc */
  620. X    undefined,        0,        /* fdfd */
  621. X    undefined,        0,        /* fdfe */
  622. X    undefined,        0,        /* fdff */
  623. X};
  624. X
  625. Xint    curaddr = 0;
  626. X
  627. Xmain ()
  628. X{
  629. X    int    i, j, arg1, arg2;
  630. X    struct opcode    *code;
  631. X    int    addr;
  632. X
  633. X    for (;;) {
  634. X        addr = curaddr;
  635. X        i = gethex();
  636. X        if (!major[i].name) {
  637. X            j = major[i].args;
  638. X            i = gethex();
  639. X            while (!minor[j][i].name) {
  640. X                j = minor[j][i].args;
  641. X                i = gethex ();
  642. X            }
  643. X            code = &minor[j][i];
  644. X        } else
  645. X            code = &major[i];
  646. X        printf ("%04x\t", addr);
  647. X        switch (code->args) {
  648. X        case 2:
  649. X            printf (code->name, gethex(), gethex());
  650. X            break;
  651. X        case 1:
  652. X            printf (code->name, gethex());
  653. X            break;
  654. X        case 0:
  655. X            printf (code->name);
  656. X            break;
  657. X        } 
  658. X        putchar ('\n');
  659. X    }
  660. X}
  661. X
  662. Xint    inline;
  663. Xint    index;
  664. X
  665. Xchar    linebuf[1024];
  666. X
  667. Xint    hexbuf[1024];
  668. X
  669. Xgethex ()
  670. X{
  671. X    if (index == inline) {
  672. X    again:    ;
  673. X        if (gets (linebuf) == 0)
  674. X            exit (0);
  675. X        if (strlen (linebuf) < 9)
  676. X            goto again;
  677. X        inline = fromhex (linebuf+1);
  678. X        for (index = 0; index < inline; index++)
  679. X            hexbuf[index] = fromhex (linebuf+9 + 2 * index);
  680. X        index = 0;
  681. X    }
  682. X    ++curaddr;
  683. X    return hexbuf[index++];
  684. X}
  685. X
  686. X#define hexval(c)    (('0' <= (c) && (c) <= '9') ? (c) - '0' :\
  687. X            (('a' <= (c) && (c) <= 'f') ? (c) - 'a' + 10 :\
  688. X            (('A' <= (c) && (c) <= 'F') ? (c) - 'A' + 10 :\
  689. X                -1 ))) 
  690. X
  691. Xfromhex (c)
  692. Xchar    *c;
  693. X{
  694. X    return hexval(c[0]) * 16 + hexval(c[1]);
  695. X}
  696. SHAR_EOF
  697. chmod 0755 zmac/zdis.c
  698. sed 's/^X//' << 'SHAR_EOF' > zmac/zmac.1
  699. X.TH ZMAC l 
  700. X.SH NAME
  701. Xzmac \- macro cross-assembler for the Zilog Z80 microprocessor
  702. X.SH SYNOPSIS
  703. Xzmac [-bdefgilLmnopst] infile
  704. X.SH DESCRIPTION
  705. XThe
  706. X.I Zmac
  707. Xassembler is modeled after the Intel 8080 macro cross-assembler
  708. Xfor the Intel 8080 by Ken Borgendale.  The major features are:  Full
  709. Xmacro capabilities, Conditional assembly, A very flexible set of
  710. Xlisting options and pseudo-ops, Symbol table output, Error report,
  711. XElimination of sequential searching, Commenting of source, Facilities
  712. Xfor system definiton files.
  713. X.PP
  714. X.I Zmac
  715. Xassembles the specified input file (default extension .z) and
  716. Xproduces a .hex output file.  The options are:
  717. X.TP 8
  718. X.B b
  719. Xno binary  
  720. X.TP 8
  721. X.B d
  722. Xdebug  
  723. X.TP 8
  724. X.B e
  725. Xerror list only  
  726. X.TP 8
  727. X.B f
  728. Xprint if skipped lines  
  729. X.TP 8
  730. X.B g
  731. Xdo not list extra code  
  732. X.TP 8
  733. X.B i
  734. Xdo not list include files 
  735. X.TP 8
  736. X.B l
  737. Xno list  
  738. X.TP 8
  739. X.B L
  740. Xforce listing of everything 
  741. X.TP 8
  742. X.B m
  743. Xprint macro expansions  
  744. X.TP 8
  745. X.B n
  746. Xput line numbers off 
  747. X.TP 8
  748. X.B o
  749. Xlist to standard output  
  750. X.TP 8
  751. X.B p
  752. Xput out four \\n's for eject 
  753. X.TP 8
  754. X.B s
  755. Xdon't produce a symbol list  
  756. X.TP 8
  757. X.B t
  758. Xdon't know what this option does
  759. X.SH SEE ALSO
  760. Xzdis(l)
  761. X.SH FILES
  762. XSource is in /usr/local/src/zmac directory.
  763. X.SH BUGS
  764. XThe man page is incomplete.  If anyone discovers more information about
  765. Xusing zmac, please consider helping to update the man page.
  766. SHAR_EOF
  767. chmod 0755 zmac/zmac.1
  768. sed 's/^X//' << 'SHAR_EOF' > zmac/zmac.y
  769. X%{
  770. X/*
  771. X *  zmac -- macro cross-assembler for the Zilog Z80 microprocessor
  772. X *
  773. X *  Bruce Norskog    4/78
  774. X *
  775. X *  Last modification  1-18-87 by cdk
  776. X *  This assembler is modeled after the Intel 8080 macro cross-assembler
  777. X *  for the Intel 8080 by Ken Borgendale.  The major features are:
  778. X *    1.  Full macro capabilities
  779. X *    2.  Conditional assembly
  780. X *    3.  A very flexible set of listing options and pseudo-ops
  781. X *    4.  Symbol table output
  782. X *    5.  Error report
  783. X *    6.  Elimination of sequential searching
  784. X *    7.  Commenting of source
  785. X *    8.  Facilities for system definiton files
  786. X *
  787. X * Revision History:
  788. X *
  789. X * jrp    3-8-82    Converted to run on Vax, updated syntax to conform better
  790. X *        to the Zilog standard.
  791. X *
  792. X * jrp    3-15-82    Added underscore as a character type in the lex table
  793. X *        'numpart' (0x5F).
  794. X *
  795. X *        Changed maximum number of characters in a label to 15
  796. X *        from 7. Note that 'putsymtab' uses this value inside
  797. X *        of a quoted string, so we use 15.
  798. X *
  799. X * jrp    2-15-83    Fixed 'getlocal' to return better local labels. It used
  800. X *        to crash after 6 invocations.
  801. X *
  802. X * jrp    6-7-83    Fixed bug in the ADD IX,... instruction.
  803. X *
  804. X * jrp    5-11-84    Added code to print unused labels out with the symbol table
  805. X *        Also sped up the macro processor by using stdio.
  806. X *
  807. X * jrp 5-22-84    Added include files ala ormac
  808. X *
  809. X * jrp 8-27-84    Added PHASE/DEPHASE commands
  810. X *
  811. X * cdk 9-20-86    Converted to run on a Pyramid.  This meant changing yylval
  812. X *        to be a %union, and then putting in the appropriate
  813. X *        typecasts where ints are pointers are used interchangeably.
  814. X *        The current version still probably won't run on machines where
  815. X *        sizeof(int) != sizeof(char *).
  816. X *        Also changed emit() to use varargs, and got rid of the
  817. X *        old style = in front of yacc action code.
  818. X *            -Colin Kelley  vu-vlsi!colin
  819. X *
  820. X * cdk 10-2-86    Added some more typecasts to keep lint a little happier.
  821. X *        Removed several unused variables.  Changed most vars
  822. X *        declared as char to int, since many of them were being
  823. X *        compared with -1!  I still don't know what's going on with
  824. X *        est[][] being malloc'd and free'd everywhere...it looks pretty
  825. X *        fishy...
  826. X *
  827. X * cdk 1-18-87  Added MIO code to emulate 'mfile' using malloc()'d memory.
  828. X *        This was needed to get the code to work when compiled under
  829. X *        MSC 4.0 on a PC, and it's probably faster anyway.
  830. X *
  831. X * cdk 2-5-87    Added 'cmp' as a synonym for 'cp', 'jmp' as a synonym for
  832. X *        'jp', and added tolerance of accumulator specification for arithmetic
  833. X *        and logical instructions.  (For example, 'or a,12' is now accepted,
  834. X *        same as 'or 12'.)
  835. X */
  836. X
  837. X
  838. X#define MIO        /* use emulation routines from mio.c */
  839. X
  840. X#include <stdio.h>
  841. X#ifdef MSDOS
  842. X#include <fcntl.h>
  843. X#else
  844. X#include <sys/file.h>    /* for open() calls */
  845. X#endif
  846. X
  847. X#ifdef vax11c
  848. X#define unlink(filename) delete(filename)
  849. X#endif
  850. X
  851. X#ifdef MIO
  852. XFILE *mfopen();
  853. X#else
  854. X#define mfopen(filename,mode) fopen(filename,mode)
  855. X#define mfclose(filename,mode) fclose(filename,mode) 
  856. X#define mfputc(c,f) putc(c,f)
  857. X#define mfgetc(f) getc(f)
  858. X#define mfseek(f,loc,origin) fseek(f,loc,origin)
  859. X#define mfread(ptr,size,nitems,f) fread(ptr,size,nitems,f)
  860. X#define mfwrite(ptr,size,nitems,f) fread(ptr,size,nitems,f)
  861. X#endif /* MIO */
  862. X
  863. X/*
  864. X * DEBUG turns on pass reporting.
  865. X * Macro debug and Token debug enables.
  866. X#define    DEBUG
  867. X#define    M_DEBUG    
  868. X#define    T_DEBUG
  869. X */
  870. X
  871. X#define ITEMTABLESIZE    2000
  872. X#define TEMPBUFSIZE    200
  873. X#define LINEBUFFERSIZE    200
  874. X#define EMITBUFFERSIZE    200
  875. X#define MAXSYMBOLSIZE    15
  876. X#define IFSTACKSIZE    20
  877. X#define MAXIFS        150
  878. X#define TITLELEN    50
  879. X#define BINPERLINE    16
  880. X#define    PARMMAX        25
  881. X#define MAXEXP        25
  882. X#define SYMMAJIC    07203
  883. X#define    NEST_IN        8
  884. X
  885. X
  886. X#define loop    for(;;)
  887. X
  888. Xyyerror(err)
  889. Xchar *err;
  890. X{}        /* we will do our own error printing */
  891. X
  892. Xstruct    item    {
  893. X    char    *i_string;
  894. X    int    i_value;
  895. X    int    i_token;
  896. X    int    i_uses;
  897. X};
  898. X
  899. XFILE    *fout,
  900. X    *fbuf,
  901. X    *fin[NEST_IN],
  902. X    *now_file ;
  903. X
  904. Xchar *malloc() ;
  905. X
  906. Xint    pass2;    /*set when pass one completed*/
  907. Xint    dollarsign ;    /* location counter */
  908. Xint    olddollar ;    /* kept to put out binary */
  909. X
  910. X/* program counter save for PHASE/DEPHASE */
  911. Xint    phdollar, phbegin, phaseflag ;
  912. X
  913. Xchar    *src_name[NEST_IN] ;
  914. Xint    linein[NEST_IN] ;
  915. Xint    now_in ;
  916. X
  917. X
  918. X
  919. X#define bflag    0    /* balance error */
  920. X#define eflag    1    /* expression error */
  921. X#define fflag    2    /* format error */
  922. X#define iflag    3    /* bad digits */
  923. X#define mflag    4    /* multiply defined */
  924. X#define pflag    5    /* phase error */
  925. X#define uflag    6    /* undeclared used */
  926. X#define vflag    7    /* value out of range */
  927. X#define oflag    8    /* phase/dephase error */
  928. X
  929. X#define FLAGS    9    /* number of flags */
  930. X
  931. Xchar    err[FLAGS];
  932. Xint    keeperr[FLAGS];
  933. Xchar    errlet[]="BEFIMPUVO";
  934. Xchar    *errname[]={
  935. X    "Balance",
  936. X    "Expression",
  937. X    "Format",
  938. X    "Digit",
  939. X    "Mult. def.",
  940. X    "Phase",
  941. X    "Undeclared",
  942. X    "Value",
  943. X    "Phase/Dephase",
  944. X};
  945. X
  946. X
  947. Xchar    linebuf[LINEBUFFERSIZE];
  948. Xchar    *lineptr;
  949. Xchar    *linemax = &linebuf[LINEBUFFERSIZE];
  950. X
  951. Xchar    outbin[BINPERLINE];
  952. Xchar    *outbinp = outbin;
  953. Xchar    *outbinm = &outbin[BINPERLINE];
  954. X
  955. Xchar    emitbuf[EMITBUFFERSIZE];
  956. Xchar    *emitptr;
  957. X
  958. Xchar    ifstack[IFSTACKSIZE];
  959. Xchar    *ifptr;
  960. Xchar    *ifstmax = &ifstack[IFSTACKSIZE-1];
  961. X
  962. X
  963. Xchar    expif[MAXIFS];
  964. Xchar    *expifp;
  965. Xchar    *expifmax = &expif[MAXIFS];
  966. X
  967. Xchar    hexadec[] = "0123456789ABCDEF" ;
  968. Xchar    *expstack[MAXEXP];
  969. Xint    expptr;
  970. X
  971. X
  972. Xint    nitems;
  973. Xint    linecnt;
  974. Xint    nbytes;
  975. Xint    invented;
  976. X
  977. X
  978. Xchar    tempbuf[TEMPBUFSIZE];
  979. Xchar    *tempmax = &tempbuf[TEMPBUFSIZE-1];
  980. X
  981. Xchar    inmlex;
  982. Xchar    arg_flag;
  983. Xchar    quoteflag;
  984. Xint    parm_number;
  985. Xint    exp_number;
  986. Xchar    symlong[] = "Symbol too long";
  987. X
  988. Xint    disp;
  989. X#define FLOC    PARMMAX
  990. X#define TEMPNUM    PARMMAX+1
  991. Xchar    **est;
  992. Xchar    **est2;
  993. X
  994. Xchar    *floc;
  995. Xint    mfptr;
  996. XFILE    *mfile;
  997. X
  998. Xchar    *writesyms;
  999. X
  1000. X
  1001. Xchar    *title;
  1002. Xchar    titlespace[TITLELEN];
  1003. Xchar    *timp,*ctime();
  1004. Xchar    *sourcef;
  1005. Xchar    src[15];
  1006. Xchar    bin[15];
  1007. Xchar    mtmp[15];
  1008. Xchar    listf[15];
  1009. X
  1010. Xchar    bopt = 1,
  1011. X    edef = 1,
  1012. X    eopt = 1,
  1013. X    fdef = 0,
  1014. X    fopt = 0,
  1015. X    gdef = 1,
  1016. X    gopt = 1,
  1017. X    iopt = 0 ,    /* list include files */
  1018. X    lstoff = 0,
  1019. X    lston = 0,    /* flag to force listing on */
  1020. X    lopt = 0,
  1021. X    mdef = 0,
  1022. X    mopt = 0,
  1023. X    nopt = 1 ,    /* line numbers on as default */
  1024. X    oopt = 0,
  1025. X    popt = 1,    /* form feed as default page eject */
  1026. X    sopt = 0,    /* turn on symbol table listing */
  1027. X    topt = 1;
  1028. X    saveopt;
  1029. X
  1030. Xchar    xeq_flag = 0;
  1031. Xint    xeq;
  1032. X
  1033. Xlong    now;
  1034. Xint    line;
  1035. Xint    page = 1;
  1036. X
  1037. Xstruct stab {
  1038. X    char    t_name[MAXSYMBOLSIZE+1];
  1039. X    int    t_value;
  1040. X    int    t_token;
  1041. X};
  1042. X
  1043. X/*
  1044. X *  push back character
  1045. X */
  1046. Xint    peekc;
  1047. X
  1048. X
  1049. X/*
  1050. X *  add a character to the output line buffer
  1051. X */
  1052. Xaddtoline(ac)
  1053. Xint    ac;
  1054. X{
  1055. X    /* check for EOF from stdio */
  1056. X    if (ac == -1)
  1057. X        ac = 0 ;
  1058. X    if (inmlex)
  1059. X        return(ac);
  1060. X    if (lineptr >= linemax)
  1061. X        error("line buffer overflow");
  1062. X    *lineptr++ = ac;
  1063. X    return(ac);
  1064. X}
  1065. X
  1066. X#include <varargs.h>
  1067. X
  1068. X/*
  1069. X *  put values in buffer for outputing
  1070. X */
  1071. X
  1072. X/*VARARGS*/
  1073. X/*ARGSUSED*/
  1074. Xemit(va_alist)
  1075. Xva_dcl
  1076. X{    
  1077. X    register int bytes;
  1078. X    va_list ap;
  1079. X    va_start(ap);
  1080. X
  1081. X    bytes = va_arg(ap,int);
  1082. X
  1083. X    while    (--bytes >= 0)
  1084. X        if (emitptr >= &emitbuf[EMITBUFFERSIZE])
  1085. X            error("emit buffer overflow");
  1086. X        else {
  1087. X            *emitptr++ = va_arg(ap,int);
  1088. X        }
  1089. X    va_end(ap);
  1090. X}
  1091. X
  1092. X
  1093. Xemit1(opcode,regvalh,data16,type)
  1094. Xint    opcode,regvalh,data16,type;
  1095. X{
  1096. X    if (regvalh & 0x8000) {
  1097. X        if (type & 1 == 0 && (disp > 127 || disp < -128))
  1098. X            err[vflag]++;
  1099. X        switch(type) {
  1100. X        case 0:
  1101. X            if (opcode & 0x8000)
  1102. X                emit(4, regvalh >> 8, opcode >> 8, disp, opcode);
  1103. X            else
  1104. X                emit(3, regvalh >> 8, opcode, disp);
  1105. X            break;
  1106. X        case 1:
  1107. X            emit(2, regvalh >> 8, opcode);
  1108. X            break;
  1109. X        case 2:
  1110. X            if (data16 > 255 || data16 < -128)
  1111. X                err[vflag]++;
  1112. X            emit(4, regvalh >> 8, opcode, disp, data16);
  1113. X            break;
  1114. X        case 5:
  1115. X            emit(4, regvalh >> 8, opcode, data16, data16 >> 8);
  1116. X        }
  1117. X    } else
  1118. X        switch(type) {
  1119. X        case 0:
  1120. X            if (opcode & 0100000)
  1121. X                emit(2, opcode >> 8, opcode);
  1122. X            else
  1123. X                emit(1, opcode);
  1124. X            break;
  1125. X        case 1:
  1126. X            if (opcode & 0100000)
  1127. X                emit(2, opcode >> 8, opcode);
  1128. X            else
  1129. X                emit(1, opcode);
  1130. X            break;
  1131. X        case 2:
  1132. X            if (data16 > 255 || data16 < -128)
  1133. X                err[vflag]++;
  1134. X            emit(2, opcode, data16);
  1135. X            break;
  1136. X        case 3:
  1137. X            if (data16 >255 || data16 < -128)
  1138. X                err[vflag]++;
  1139. X            emit(2, opcode, data16);
  1140. X            break;
  1141. X        case 5:
  1142. X            if (opcode & 0100000)
  1143. X                emit(4, opcode >> 8, opcode, data16, data16 >> 8);
  1144. X            else
  1145. X                emit(3, opcode, data16, data16 >> 8);
  1146. X        }
  1147. X}
  1148. X
  1149. X
  1150. X
  1151. X
  1152. Xemitdad(rp1,rp2)
  1153. Xint rp1,rp2;
  1154. X{
  1155. X    if (rp1 & 0x8000)
  1156. X        emit(2,rp1 >> 8, rp2 + 9);
  1157. X    else
  1158. X        emit(1,rp2 + 9);
  1159. X}
  1160. X
  1161. X
  1162. Xemitjr(opcode,expr)
  1163. Xint    opcode,expr;
  1164. X{
  1165. X    disp = expr - dollarsign - 2;
  1166. X    if (disp > 127 || disp < -128)
  1167. X        err[vflag]++;
  1168. X    emit(2, opcode, disp);
  1169. X}
  1170. X
  1171. X
  1172. X
  1173. X
  1174. X/*
  1175. X *  put out a byte of binary 
  1176. X */
  1177. Xputbin(v)
  1178. X{
  1179. X    if(!pass2 || !bopt) return;
  1180. X    *outbinp++ = v;
  1181. X    if (outbinp >= outbinm) flushbin();
  1182. X}
  1183. X
  1184. X
  1185. X
  1186. X/*
  1187. X *  output one line of binary in INTEL standard form
  1188. X */
  1189. Xflushbin()
  1190. X{
  1191. X    register  char *p;
  1192. X    register check;
  1193. X
  1194. X    if (!pass2 || !bopt)
  1195. X        return;
  1196. X    nbytes += outbinp-outbin;
  1197. X    if (check = outbinp-outbin) {
  1198. X        putc(':', fbuf);
  1199. X        puthex(check, fbuf);
  1200. X        puthex(olddollar>>8, fbuf);
  1201. X        puthex(olddollar, fbuf);
  1202. X        puthex(0, fbuf);
  1203. X        check += (olddollar >> 8) + olddollar;
  1204. X        olddollar += (outbinp-outbin);
  1205. X        for (p=outbin; p<outbinp; p++) {
  1206. X            puthex(*p, fbuf);
  1207. X            check += *p;
  1208. X        }
  1209. X        puthex(256-check, fbuf);
  1210. X        putc('\n', fbuf);
  1211. X        outbinp = outbin;
  1212. X    }
  1213. X}
  1214. X
  1215. X
  1216. X
  1217. X/*
  1218. X *  put out one byte of hex
  1219. X */
  1220. Xputhex(byte, buf)
  1221. Xchar    byte;
  1222. XFILE    *buf;
  1223. X{
  1224. X    putc(hexadec[(byte >> 4) & 017], buf);
  1225. X    putc(hexadec[byte & 017], buf);
  1226. X}
  1227. X
  1228. X/*
  1229. X *  put out a line of output -- also put out binary
  1230. X */
  1231. Xlist(optarg)
  1232. Xint    optarg;
  1233. X{
  1234. X    register char *    p;
  1235. X    register int    i;
  1236. X    int  lst;
  1237. X
  1238. X    if (!expptr)
  1239. X        linecnt++;
  1240. X    addtoline('\0');
  1241. X    if (pass2) {
  1242. X        lst = iflist();
  1243. X        if (lst) {
  1244. X            lineout();
  1245. X            if (nopt)
  1246. X                fprintf(fout, "%4d:\t", linein[now_in]);
  1247. X            puthex(optarg >> 8, fout);
  1248. X            puthex(optarg, fout);
  1249. X            fputs("  ", fout);
  1250. X            for (p = emitbuf; (p < emitptr) && (p - emitbuf < 4); p++) {
  1251. X                puthex(*p, fout);
  1252. X            }
  1253. X            for (i = 4 - (p-emitbuf); i > 0; i--)
  1254. X                fputs("  ", fout);
  1255. X            putc('\t', fout);
  1256. X            fputs(linebuf, fout);
  1257. X        }
  1258. X
  1259. X        if (bopt) {
  1260. X            for (p = emitbuf; p < emitptr; p++)
  1261. X                putbin(*p);
  1262. X        }
  1263. X
  1264. X
  1265. X        p = emitbuf+4;
  1266. X        while (lst && gopt && p < emitptr) {
  1267. X            lineout();
  1268. X            if (nopt) putc('\t', fout);
  1269. X            fputs("      ", fout);
  1270. X            for (i = 0; (i < 4) && (p < emitptr);i++) {
  1271. X                puthex(*p, fout);
  1272. X                p++;
  1273. X            }
  1274. X            putc('\n', fout);
  1275. X        }
  1276. X
  1277. X
  1278. X        lsterr2(lst);
  1279. X    } else
  1280. X        lsterr1();
  1281. X    dollarsign += emitptr - emitbuf;
  1282. X    emitptr = emitbuf;
  1283. X    lineptr = linebuf;
  1284. X}
  1285. X
  1286. X
  1287. X
  1288. X/*
  1289. X *  keep track of line numbers and put out headers as necessary
  1290. X */
  1291. Xlineout()
  1292. X{
  1293. X    if (line == 60) {
  1294. X        if (popt)
  1295. X            putc('\014', fout);    /* send the form feed */
  1296. X        else
  1297. X            fputs("\n\n\n\n\n", fout);
  1298. X        line = 0;
  1299. X    }
  1300. X    if (line == 0) {
  1301. X        fprintf(fout, "\n\n%s %s\t%s\t Page %d\n\n\n",
  1302. X            &timp[4], &timp[20], title, page++);
  1303. X        line = 4;
  1304. X    }
  1305. X    line++;
  1306. X}
  1307. X
  1308. X
  1309. X/*
  1310. X *  cause a page eject
  1311. X */
  1312. Xeject()
  1313. X{
  1314. X    if (pass2 && iflist()) {
  1315. X        if (popt) {
  1316. X            putc('\014', fout);    /* send the form feed */
  1317. X        } else {
  1318. X            while (line < 65) {
  1319. X                line++;
  1320. X                putc('\n', fout);
  1321. X            }
  1322. X        }
  1323. X    }
  1324. X    line = 0;
  1325. X}
  1326. X
  1327. X
  1328. X/*
  1329. X *  space n lines on the list file
  1330. X */
  1331. Xspace(n)
  1332. X{
  1333. X    int    i ;
  1334. X    if (pass2 && iflist())
  1335. X        for (i = 0; i<n; i++) {
  1336. X            lineout();
  1337. X            putc('\n', fout);
  1338. X        }
  1339. X}
  1340. X
  1341. X
  1342. X/*
  1343. X *  Error handling - pass 1
  1344. X */
  1345. Xlsterr1() {
  1346. X    register int i;
  1347. X    if (topt)
  1348. X        for (i = 0; i <= 4; i++)
  1349. X            if (err[i]) {
  1350. X                errorprt(i);
  1351. X                err[i] = 0;
  1352. X            }
  1353. X}
  1354. X
  1355. X
  1356. X/*
  1357. X *  Error handling - pass 2.
  1358. X */
  1359. Xlsterr2(lst)
  1360. Xint    lst;
  1361. X{
  1362. X    register int i;
  1363. X    for (i=0; i<FLAGS; i++)
  1364. X        if (err[i]) {
  1365. X            if (lst) {
  1366. X                lineout();
  1367. X                putc(errlet[i], fout);
  1368. X                putc('\n', fout);
  1369. X            }
  1370. X            err[i] = 0;
  1371. X            keeperr[i]++;
  1372. X            if (i > 4 && topt)
  1373. X                errorprt(i);
  1374. X        }
  1375. X
  1376. X    fflush(fout);    /*to avoid putc(har) mix bug*/
  1377. X}
  1378. X
  1379. X/*
  1380. X *  print diagnostic to error terminal
  1381. X */
  1382. Xerrorprt(errnum)
  1383. Xint    errnum;
  1384. X{
  1385. X    fprintf(stderr,"%d: %s error\n%s\n",
  1386. X        linecnt, errname[errnum], linebuf) ;
  1387. X    fflush(stderr) ;
  1388. X    return ;
  1389. X}
  1390. X
  1391. X
  1392. X/*
  1393. X *  list without address -- for comments and if skipped lines
  1394. X */
  1395. Xlist1()
  1396. X{
  1397. X    int lst;
  1398. X
  1399. X    addtoline('\0');
  1400. X    lineptr = linebuf;
  1401. X    if (!expptr) linecnt++;
  1402. X    if (pass2)
  1403. X        if (lst = iflist()) {
  1404. X            lineout();
  1405. X            if (nopt)
  1406. X                fprintf(fout, "%4d:\t", linein[now_in]);
  1407. X            fprintf(fout, "\t\t%s", linebuf);
  1408. X            lsterr2(lst);
  1409. X        }
  1410. X    else
  1411. X        lsterr1();
  1412. X}
  1413. X
  1414. X
  1415. X/*
  1416. X *  see if listing is desired
  1417. X */
  1418. Xiflist()
  1419. X{
  1420. X    register  i, j;
  1421. X
  1422. X    if (lston)
  1423. X        return(1) ;
  1424. X    if (lopt)
  1425. X        return(0);
  1426. X    if (*ifptr && !fopt)
  1427. X        return(0);
  1428. X    if (!lstoff && !expptr)
  1429. X        return(1);
  1430. X    j = 0;
  1431. X    for (i=0; i<FLAGS; i++)
  1432. X        if (err[i])
  1433. X            j++;
  1434. X    if (expptr)
  1435. X        return(mopt || j);
  1436. X    if (eopt && j)
  1437. X        return(1);
  1438. X    return(0);
  1439. X}
  1440. X
  1441. X
  1442. X%}
  1443. X
  1444. X%union    {
  1445. X    struct item *itemptr;
  1446. X    int ival;
  1447. X    char *cval;
  1448. X    }
  1449. X
  1450. X%token <cval> STRING
  1451. X%token <itemptr> NOOPERAND
  1452. X%token <itemptr> ARITHC
  1453. X%token ADD
  1454. X%token <itemptr> LOGICAL
  1455. X%token <itemptr> BIT
  1456. X%token CALL
  1457. X%token <itemptr> INCDEC
  1458. X%token <itemptr> DJNZ
  1459. X%token EX
  1460. X%token <itemptr> IM
  1461. X%token PHASE
  1462. X%token DEPHASE
  1463. X%token <itemptr> IN
  1464. X%token JP
  1465. X%token <itemptr> JR
  1466. X%token LD
  1467. X%token <itemptr> OUT
  1468. X%token <itemptr> PUSHPOP
  1469. X%token <itemptr> RET
  1470. X%token <itemptr> SHIFT
  1471. X%token <itemptr> RST
  1472. X%token <itemptr> REGNAME
  1473. X%token <itemptr> ACC
  1474. X%token <itemptr> C
  1475. X%token <itemptr> RP
  1476. X%token <itemptr> HL
  1477. X%token <itemptr> INDEX
  1478. X%token <itemptr> AF
  1479. X%token <itemptr> SP
  1480. X%token <itemptr> MISCREG
  1481. X%token F
  1482. X%token <itemptr> COND
  1483. X%token <itemptr> SPCOND
  1484. X%token <ival> NUMBER
  1485. X%token <itemptr> UNDECLARED
  1486. X%token END
  1487. X%token ORG
  1488. X%token DEFB
  1489. X%token DEFS
  1490. X%token DEFW
  1491. X%token EQU
  1492. X%token DEFL
  1493. X%token <itemptr> LABEL
  1494. X%token <itemptr> EQUATED
  1495. X%token <itemptr> WASEQUATED
  1496. X%token <itemptr> DEFLED
  1497. X%token <itemptr> MULTDEF
  1498. X%token <ival> MOD
  1499. X%token <ival> SHL
  1500. X%token <ival> SHR
  1501. X%token <ival> NOT
  1502. X%token IF
  1503. X%token ENDIF
  1504. X%token <itemptr> ARGPSEUDO
  1505. X%token <itemptr> LIST
  1506. X%token <itemptr> MINMAX
  1507. X%token MACRO
  1508. X%token <itemptr> MNAME
  1509. X%token <itemptr> OLDMNAME
  1510. X%token ARG
  1511. X%token ENDM
  1512. X%token MPARM
  1513. X%token <ival> ONECHAR
  1514. X%token <ival> TWOCHAR
  1515. X
  1516. X%type <itemptr> label.part symbol
  1517. X%type <ival> reg evenreg realreg mem pushable bcdesp bcdehlsp mar condition
  1518. X%type <ival> spcondition parenexpr expression lxexpression
  1519. X
  1520. X%left '|' '^'
  1521. X%left '&'
  1522. X%nonassoc NOT
  1523. X%left '+' '-'
  1524. X%left '*' '/' MOD SHL SHR
  1525. X%left UNARY
  1526. X%%
  1527. X
  1528. X%{
  1529. Xchar  *cp;
  1530. Xint  i;
  1531. X%}
  1532. X
  1533. Xprogram:
  1534. X    statements
  1535. X|
  1536. X    error    {    error("file bad");    }
  1537. X;
  1538. X
  1539. X
  1540. Xstatements:
  1541. X    statement
  1542. X|
  1543. X    statements statement
  1544. X|
  1545. X    statements error    {
  1546. X        fprintf(stderr,"statement error\n");
  1547. X        err[fflag]++;
  1548. X        quoteflag = 0;
  1549. X        while(yychar != '\n' && yychar != '\0') yychar = yylex();
  1550. X        list(dollarsign);
  1551. X        yyclearin;yyerrok;
  1552. X    }
  1553. X;
  1554. X
  1555. X
  1556. Xstatement:
  1557. X    label.part '\n'    { 
  1558. X        if ($1) list(dollarsign);
  1559. X        else  list1();
  1560. X    }
  1561. X|
  1562. X    label.part operation '\n' {
  1563. X        list(dollarsign);
  1564. X    }
  1565. X|
  1566. X    symbol EQU expression '\n' {
  1567. X        switch($1->i_token) {
  1568. X        case UNDECLARED: case WASEQUATED:
  1569. X            $1->i_token = EQUATED;
  1570. X            $1->i_value = $3;
  1571. X            break;
  1572. X        default:
  1573. X            err[mflag]++;
  1574. X            $1->i_token = MULTDEF;
  1575. X        }
  1576. X        list($3);
  1577. X    }
  1578. X|
  1579. X    symbol DEFL expression '\n' {
  1580. X        switch($1->i_token) {
  1581. X        case UNDECLARED: case DEFLED:
  1582. X            $1->i_token = DEFLED;
  1583. X            $1->i_value = $3;
  1584. X            break;
  1585. X        default:
  1586. X            err[mflag]++;
  1587. X            $1->i_token = MULTDEF;
  1588. X        }
  1589. X        list($3);
  1590. X    }
  1591. X|
  1592. X    symbol MINMAX expression ',' expression '\n' {
  1593. X        switch ($1->i_token) {
  1594. X        case UNDECLARED: case DEFLED:
  1595. X            $1->i_token = DEFLED;
  1596. X            if ($2->i_value)    /* max */
  1597. X                list($1->i_value = ($3 > $5? $3:$5));
  1598. X            else list($1->i_value = ($3 < $5? $3:$5));
  1599. X            break;
  1600. X        default:
  1601. X            err[mflag]++;
  1602. X            $1->i_token = MULTDEF;
  1603. X            list($1->i_value);
  1604. X        }
  1605. X    }
  1606. X|
  1607. X    IF expression '\n' {
  1608. X        if (ifptr >= ifstmax)
  1609. X            error("Too many ifs");
  1610. X        else {
  1611. X            if (pass2) {
  1612. X                *++ifptr = *expifp++;
  1613. X                if (*ifptr != !(yypv[2].ival)) err[pflag]++;
  1614. X            } else {
  1615. X                if (expifp >= expifmax)
  1616. X                    error("Too many ifs!");
  1617. X                *expifp++ = !(yypv[2].ival);
  1618. X                *++ifptr = !(yypv[2].ival);
  1619. X            }
  1620. X        }
  1621. X        saveopt = fopt;
  1622. X        fopt = 1;
  1623. X        list(yypv[2].ival);
  1624. X        fopt = saveopt;
  1625. X    }
  1626. X|
  1627. X    ENDIF '\n' {
  1628. X        if (ifptr == ifstack) err[bflag]++;
  1629. X        else --ifptr;
  1630. X        list1();
  1631. X    }
  1632. X|
  1633. X    label.part END '\n' {
  1634. X        list(dollarsign);
  1635. X        peekc = 0;
  1636. X    }
  1637. X|
  1638. X    label.part END expression '\n' {
  1639. X        xeq_flag++;
  1640. X        xeq = $3;
  1641. X        list($3);
  1642. X        peekc = 0;
  1643. X    }
  1644. X|
  1645. X    label.part DEFS expression '\n' {
  1646. X        if ($3 < 0) err[vflag]++;
  1647. X        list(dollarsign);
  1648. X        if ($3) {
  1649. X            flushbin();
  1650. X            dollarsign += $3;
  1651. X            olddollar = dollarsign;
  1652. X        }
  1653. X    }
  1654. X|
  1655. X    ARGPSEUDO arg_on ARG  arg_off '\n' {
  1656. X        list1();
  1657. X        switch ($1->i_value) {
  1658. X
  1659. X        case 0:        /* title */
  1660. X            lineptr = linebuf;
  1661. X            cp = tempbuf;
  1662. X            title = titlespace;
  1663. X            while ((*title++ = *cp++) && (title < &titlespace[TITLELEN]));
  1664. X            *title = 0;
  1665. X            title = titlespace;
  1666. X            break;
  1667. X
  1668. X        case 1:        /* rsym */
  1669. X            if (pass2) break;
  1670. X            insymtab(tempbuf);
  1671. X            break;
  1672. X
  1673. X        case 2:        /* wsym */
  1674. X            writesyms = malloc(strlen(tempbuf)+1);
  1675. X            strcpy(writesyms, tempbuf);
  1676. X            break;
  1677. X        case 3:        /* include file */
  1678. X            next_source(tempbuf) ;
  1679. X            break ;
  1680. X        }
  1681. X    }
  1682. X|
  1683. X    ARGPSEUDO arg_on '\n' arg_off {
  1684. X        fprintf(stderr,"ARGPSEUDO error\n");
  1685. X        err[fflag]++;
  1686. X        list(dollarsign);
  1687. X    }
  1688. X|
  1689. X    LIST '\n' {
  1690. X        if ($1 != (struct item *) -1) $<ival>2 = 1;
  1691. X        goto dolopt; }
  1692. X|
  1693. X    LIST expression '\n' {
  1694. X    dolopt:
  1695. X        linecnt++;
  1696. X        if (pass2) {
  1697. X            lineptr = linebuf;
  1698. X            switch ($1->i_value) {
  1699. X            case 0:    /* list */
  1700. X                if ($2 < 0) lstoff = 1;
  1701. X                if ($2 > 0) lstoff = 0;
  1702. X                break;
  1703. X
  1704. X            case 1:    /* eject */
  1705. X                if ($2) eject();
  1706. X                break;
  1707. X
  1708. X            case 2:    /* space */
  1709. X                if ((line + $2) > 60) eject();
  1710. X                else space($2);
  1711. X                break;
  1712. X
  1713. X            case 3:    /* elist */
  1714. X                eopt = edef;
  1715. X                if ($2 < 0) eopt = 0;
  1716. X                if ($2 > 0) eopt = 1;
  1717. X                break;
  1718. X
  1719. X            case 4:    /* fopt */
  1720. X                fopt = fdef;
  1721. X                if ($2 < 0) fopt = 0;
  1722. X                if ($2 > 0) fopt = 1;
  1723. X                break;
  1724. X
  1725. X            case 5:    /* gopt */
  1726. X                gopt = gdef;
  1727. X                if ($2 < 0) gopt = 1;
  1728. X                if ($2 > 0) gopt = 0;
  1729. X                break;
  1730. X
  1731. X            case 6: /* mopt */
  1732. X                mopt = mdef;
  1733. X                if ($2 < 0) mopt = 0;
  1734. X                if ($2 > 0) mopt = 1;
  1735. X            }
  1736. X        }
  1737. X    }
  1738. X|
  1739. X    UNDECLARED MACRO parm.list '\n' {
  1740. X        $1->i_token = MNAME;
  1741. X        $1->i_value = mfptr;
  1742. X        mfseek(mfile, (long)mfptr, 0);
  1743. X        list1();
  1744. X        mlex() ;
  1745. X        parm_number = 0;
  1746. X    }
  1747. X|
  1748. X    OLDMNAME MACRO {
  1749. X        $1->i_token = MNAME;
  1750. X        while (yychar != ENDM && yychar) {
  1751. X            while (yychar != '\n' && yychar)
  1752. X                yychar = yylex();
  1753. X            list1();
  1754. X            yychar = yylex();
  1755. X        }
  1756. X        while (yychar != '\n' && yychar) yychar = yylex();
  1757. X        list1();
  1758. X        yychar = yylex();
  1759. X    }
  1760. X|
  1761. X    label.part MNAME al arg.list '\n' {
  1762. X    expand:
  1763. X        $2->i_uses++ ;
  1764. X        arg_flag = 0;
  1765. X        parm_number = 0;
  1766. X        list(dollarsign);
  1767. X        expptr++;
  1768. X        est = est2;
  1769. X        est[FLOC] = floc;
  1770. X        est[TEMPNUM] = (char *)exp_number++;
  1771. X        floc = (char *)($2->i_value);
  1772. X        mfseek(mfile, (long)floc, 0);
  1773. X    }
  1774. X;
  1775. X
  1776. X
  1777. Xlabel.part:
  1778. X    /*empty*/
  1779. X     {    $$ = NULL;    }
  1780. X|
  1781. X    symbol ':' {
  1782. X        switch($1->i_token) {
  1783. X        case UNDECLARED:
  1784. X            if (pass2)
  1785. X                err[pflag]++;
  1786. X            else {
  1787. X                $1->i_token = LABEL;
  1788. X                $1->i_value = dollarsign;
  1789. X            }
  1790. X            break;
  1791. X        case LABEL:
  1792. X            if (!pass2) {
  1793. X                $1->i_token = MULTDEF;
  1794. X                err[mflag]++;
  1795. X            } else if ($1->i_value != dollarsign)
  1796. X                err[pflag]++;
  1797. X            break;
  1798. X        default:
  1799. X            err[mflag]++;
  1800. X            $1->i_token = MULTDEF;
  1801. X        }
  1802. X    }
  1803. X;
  1804. X
  1805. X
  1806. Xoperation:
  1807. X    NOOPERAND
  1808. X        { emit1($1->i_value, 0, 0, 1); }
  1809. X|
  1810. X    JP expression
  1811. X        { emit(3, 0303, $2, $2 >> 8);    }
  1812. X|
  1813. X    CALL expression
  1814. X        {    emit(3, 0315, $2, $2 >> 8);    }
  1815. X|
  1816. X    RST    expression
  1817. X        { if ($2 > 7 || $2 < 0)
  1818. X            err[vflag]++;
  1819. X        emit(1, $1->i_value + (($2 & 7) << 3));
  1820. X    }
  1821. X|
  1822. X    ADD ACC ',' expression
  1823. X        { emit1(0306, 0, $4, 3); }
  1824. X|
  1825. X    ARITHC ACC ',' expression
  1826. X        { emit1(0306 + ($1->i_value << 3), 0, $4, 3); }
  1827. X|
  1828. X    LOGICAL expression
  1829. X        { emit1(0306 | ($1->i_value << 3), 0, $2, 3); }
  1830. X|
  1831. X    LOGICAL ACC ',' expression    /* -cdk */
  1832. X        { emit1(0306 | ($1->i_value << 3), 0, $4, 3); }
  1833. X|
  1834. X    ADD ACC ',' reg
  1835. X        { emit1(0200 + ($4 & 0377), $4, 0, 0); }
  1836. X|
  1837. X    ARITHC ACC ',' reg
  1838. X        { emit1(0200 + ($1->i_value << 3) + ($4 & 0377), $4, 0, 0); }
  1839. X|
  1840. X    LOGICAL reg
  1841. X        { emit1(0200 + ($1->i_value << 3) + ($2 & 0377), $2, 0, 0); }
  1842. X|
  1843. X    LOGICAL ACC ',' reg        /* -cdk */
  1844. X        { emit1(0200 + ($1->i_value << 3) + ($4 & 0377), $4, 0, 0); }
  1845. X|
  1846. X    SHIFT reg
  1847. X        { emit1(0145400 + ($1->i_value << 3) + ($2 & 0377), $2, 0, 0); }
  1848. X|
  1849. X    INCDEC    reg
  1850. X        { emit1($1->i_value + (($2 & 0377) << 3) + 4, $2, 0, 0); }
  1851. X|
  1852. X    ARITHC HL ',' bcdehlsp
  1853. X        { if ($1->i_value == 1)
  1854. X                emit(2,0355,0112+$4);
  1855. X            else
  1856. X                emit(2,0355,0102+$4);
  1857. X        }
  1858. X|
  1859. X    ADD mar ',' bcdesp
  1860. X        { emitdad($2,$4); }
  1861. X|
  1862. X    ADD mar ',' mar
  1863. X        {
  1864. X            if ($2 != $4) {
  1865. X                fprintf(stderr,"ADD mar, mar error\n");
  1866. X                err[fflag]++;
  1867. X            }
  1868. X            emitdad($2,$4);
  1869. X        }
  1870. X|
  1871. X    INCDEC evenreg
  1872. X        { emit1(($1->i_value << 3) + ($2 & 0377) + 3, $2, 0, 1); }
  1873. X|
  1874. X    PUSHPOP pushable
  1875. X        { emit1($1->i_value + ($2 & 0377), $2, 0, 1); }
  1876. X|
  1877. X    BIT expression ',' reg
  1878. X        {
  1879. X            if ($2 < 0 || $2 > 7)
  1880. X                err[vflag]++;
  1881. X            emit1($1->i_value + (($2 & 7) << 3) + ($4 & 0377), $4, 0, 0);
  1882. X        }
  1883. X|
  1884. X    JP condition ',' expression
  1885. X        { emit(3, 0302 + $2, $4, $4 >> 8); }
  1886. X|
  1887. X    JP '(' mar ')'
  1888. X        { emit1(0351, $3, 0, 1); }
  1889. X|
  1890. X    CALL condition ',' expression
  1891. X        { emit(3, 0304 + $2, $4, $4 >> 8); }
  1892. X|
  1893. X    JR expression
  1894. X        { emitjr(030,$2); }
  1895. X|
  1896. X    JR spcondition ',' expression
  1897. X        { emitjr($1->i_value + $2, $4); }
  1898. X|
  1899. X    DJNZ expression
  1900. X        { emitjr($1->i_value, $2); }
  1901. X|
  1902. X    RET
  1903. X        { emit(1, $1->i_value); }
  1904. X|
  1905. X    RET condition
  1906. X        { emit(1, 0300 + $2); }
  1907. X|
  1908. X    LD reg ',' reg
  1909. X        {
  1910. X            if (($2 & 0377) == 6 && ($4 & 0377) == 6) {
  1911. X                fprintf(stderr,"LD reg, reg error\n");
  1912. X                err[fflag]++;
  1913. X            }
  1914. X            emit1(0100 + (($2 & 7) << 3) + ($4 & 7),$2 | $4, 0, 0);
  1915. X        }
  1916. X|
  1917. X    LD reg ',' expression
  1918. X        { emit1(6 + (($2 & 0377) << 3), $2, $4, 2); }
  1919. X|
  1920. X    LD reg ',' '(' RP ')'
  1921. X        {    if ($2 != 7) {
  1922. X                fprintf(stderr,"LD reg, (RP) error\n");
  1923. X                err[fflag]++;
  1924. X            }
  1925. X            else emit(1, 012 + $5->i_value);
  1926. X        }
  1927. X|
  1928. X    LD reg ',' parenexpr
  1929. X        {
  1930. X            if ($2 != 7) {
  1931. X                fprintf(stderr,"LD reg, (expr) error\n");
  1932. X                err[fflag]++;
  1933. X            }
  1934. X            else emit(3, 072, $4, $4 >> 8);
  1935. X        }
  1936. X|
  1937. X    LD '(' RP ')' ',' ACC
  1938. X        { emit(1, 2 + $3->i_value); }
  1939. X|
  1940. X    LD parenexpr ',' ACC
  1941. X        { emit(3, 062, $2, $2 >> 8); }
  1942. X|
  1943. X    LD reg ',' MISCREG
  1944. X        {
  1945. X            if ($2 != 7) {
  1946. X                fprintf(stderr,"LD reg, MISCREG error\n");
  1947. X                err[fflag]++;
  1948. X            }
  1949. X            else emit(2, 0355, 0127 + $4->i_value);
  1950. X        }
  1951. X|
  1952. X    LD MISCREG ',' ACC
  1953. X        { emit(2, 0355, 0107 + $2->i_value); }
  1954. X|
  1955. X    LD evenreg ',' lxexpression
  1956. X        { emit1(1 + ($2 & 060), $2, $4, 5); }
  1957. X|
  1958. X    LD evenreg ',' parenexpr
  1959. X        {
  1960. X            if (($2 & 060) == 040)
  1961. X                emit1(052, $2, $4, 5);
  1962. X            else
  1963. X                emit(4, 0355, 0113 + $2, $4, $4 >> 8);
  1964. X        }
  1965. X|
  1966. X    LD parenexpr ',' evenreg
  1967. X        {
  1968. X            if (($4 & 060) == 040)
  1969. X                emit1(042, $4, $2, 5);
  1970. X            else
  1971. X                emit(4, 0355, 0103 + $4, $2, $2 >> 8);
  1972. X        }
  1973. X|
  1974. X    LD evenreg ',' mar
  1975. X        {
  1976. X            if ($2 != 060) {
  1977. X                fprintf(stderr,"LD evenreg error\n");
  1978. X                err[fflag]++;
  1979. X            }
  1980. X            else
  1981. X                emit1(0371, $4, 0, 1);
  1982. X        }
  1983. X|
  1984. X    EX RP ',' HL
  1985. X        {
  1986. X            if ($2->i_value != 020) {
  1987. X                fprintf(stderr,"EX RP, HL error\n");
  1988. X                err[fflag]++;
  1989. X            }
  1990. X            else
  1991. X                emit(1, 0353);
  1992. X        }
  1993. X|
  1994. X    EX AF ',' AF setqf '\'' clrqf
  1995. X        { emit(1, 010); }
  1996. X|
  1997. X    EX '(' SP ')' ',' mar
  1998. X        { emit1(0343, $6, 0, 1); }
  1999. X|
  2000. X    IN realreg ',' parenexpr
  2001. X        {
  2002. X            if ($2 != 7) {
  2003. X                fprintf(stderr,"IN reg, (expr) error\n");
  2004. X                err[fflag]++;
  2005. X            }
  2006. X            else    {
  2007. X                if ($4 < 0 || $4 > 255)
  2008. X                    err[vflag]++;
  2009. X                emit(2, $1->i_value, $4);
  2010. X            }
  2011. X        }
  2012. X|
  2013. X    IN realreg ',' '(' C ')'
  2014. X        { emit(2, 0355, 0100 + ($2 << 3)); }
  2015. X|
  2016. X    IN F ',' '(' C ')'
  2017. X        { emit(2, 0355, 0160); }
  2018. X|
  2019. X    OUT parenexpr ',' ACC
  2020. X        {
  2021. X            if ($2 < 0 || $2 > 255)
  2022. X                err[vflag]++;
  2023. X            emit(2, $1->i_value, $2);
  2024. X        }
  2025. X|
  2026. X    OUT '(' C ')' ',' realreg
  2027. X        { emit(2, 0355, 0101 + ($6 << 3)); }
  2028. X|
  2029. X    IM expression
  2030. X        {
  2031. X            if ($2 > 2 || $2 < 0)
  2032. X                err[vflag]++;
  2033. X            else
  2034. X                emit(2, $1->i_value >> 8, $1->i_value + (($2 + ($2 > 0)) << 3));
  2035. X        }
  2036. X|
  2037. X    PHASE expression
  2038. X        {
  2039. X            if (phaseflag) {
  2040. X                err[oflag]++;
  2041. X            } else {
  2042. X                phaseflag = 1;
  2043. X                phdollar = dollarsign;
  2044. X                dollarsign = $2;
  2045. X                phbegin = dollarsign;
  2046. X            }
  2047. X        }
  2048. X|
  2049. X    DEPHASE
  2050. X        {
  2051. X            if (!phaseflag) {
  2052. X                err[oflag]++;
  2053. X            } else {
  2054. X                phaseflag = 0;
  2055. X                dollarsign = phdollar + dollarsign - phbegin;
  2056. X            }
  2057. X        }
  2058. X|
  2059. X    ORG expression
  2060. X        {
  2061. X            if (phaseflag) {
  2062. X                err[oflag]++;
  2063. X                dollarsign = phdollar + dollarsign - phbegin;
  2064. X                phaseflag = 0;
  2065. X            }
  2066. X            if ($2-dollarsign) {
  2067. X                flushbin();
  2068. X                olddollar = $2;
  2069. X                dollarsign = $2;
  2070. X            }
  2071. X        }
  2072. X|
  2073. X    DEFB db.list
  2074. X|
  2075. X    DEFW dw.list
  2076. X|
  2077. X    ENDM
  2078. X;
  2079. X
  2080. X
  2081. Xparm.list:
  2082. X|
  2083. X    parm.element
  2084. X|
  2085. X    parm.list ',' parm.element
  2086. X;
  2087. X
  2088. X
  2089. Xparm.element:
  2090. X    UNDECLARED
  2091. X        {
  2092. X            $1->i_token = MPARM;
  2093. X            if (parm_number >= PARMMAX)
  2094. X                error("Too many parameters");
  2095. X            $1->i_value = parm_number++;
  2096. X        }
  2097. X;
  2098. X
  2099. X
  2100. Xarg.list:
  2101. X    /* empty */
  2102. X|
  2103. X    arg.element
  2104. X|
  2105. X    arg.list ',' arg.element
  2106. X;
  2107. X
  2108. X
  2109. Xarg.element:
  2110. X    ARG
  2111. X        {
  2112. X            cp = malloc(strlen(tempbuf)+1);
  2113. X            est2[parm_number++] = cp;
  2114. X            strcpy(cp, tempbuf);
  2115. X        }
  2116. X;
  2117. Xreg:
  2118. X    realreg
  2119. X|
  2120. X    mem
  2121. X;
  2122. Xrealreg:
  2123. X    REGNAME
  2124. X        {
  2125. X            $$ = $1->i_value;
  2126. X        }
  2127. X|
  2128. X    ACC
  2129. X        {
  2130. X            $$ = $1->i_value;
  2131. X        }
  2132. X|
  2133. X    C
  2134. X        {
  2135. X            $$ = $1->i_value;
  2136. X        }
  2137. X;
  2138. Xmem:
  2139. X    '(' HL ')'
  2140. X        {
  2141. X            $$ = 6;
  2142. X        }
  2143. X|
  2144. X    '(' INDEX expression ')'
  2145. X        {
  2146. X            disp = $3;
  2147. X            $$ = ($2->i_value & 0177400) | 6;
  2148. X        }
  2149. X|
  2150. X    '(' INDEX ')'
  2151. X        {
  2152. X            disp = 0;
  2153. X            $$ = ($2->i_value & 0177400) | 6;
  2154. X        }
  2155. X;
  2156. Xevenreg:
  2157. X    bcdesp
  2158. X|
  2159. X    mar
  2160. X;
  2161. Xpushable:
  2162. X    RP
  2163. X        {
  2164. X            $$ = $1->i_value;
  2165. X        }
  2166. X|
  2167. X    AF
  2168. X        {
  2169. X            $$ = $1->i_value;
  2170. X        }
  2171. X|
  2172. X    mar
  2173. X;
  2174. Xbcdesp:
  2175. X    RP
  2176. X        {
  2177. X            $$ = $1->i_value;
  2178. X        }
  2179. X|
  2180. X    SP
  2181. X        {
  2182. X            $$ = $1->i_value;
  2183. X        }
  2184. X;
  2185. Xbcdehlsp:
  2186. X    bcdesp
  2187. X|
  2188. X    HL
  2189. X        {
  2190. X            $$ = $1->i_value;
  2191. X        }
  2192. X;
  2193. Xmar:
  2194. X    HL
  2195. X        {
  2196. X            $$ = $1->i_value;
  2197. X        }
  2198. X|
  2199. X    INDEX
  2200. X        {
  2201. X            $$ = $1->i_value;
  2202. X        }
  2203. X;
  2204. Xcondition:
  2205. X    spcondition
  2206. X|
  2207. X    COND
  2208. X        {
  2209. X            $$ = $1->i_value;
  2210. X        }
  2211. X;
  2212. Xspcondition:
  2213. X    SPCOND
  2214. X        {
  2215. X            $$ = $1->i_value;
  2216. X        }
  2217. X|
  2218. X    C
  2219. X        {    $$ = 030;    }
  2220. X;
  2221. Xdb.list:
  2222. X    db.list.element
  2223. X|
  2224. X    db.list ',' db.list.element
  2225. X;
  2226. Xdb.list.element:
  2227. X    TWOCHAR
  2228. X        {
  2229. X            emit(2, $1, $1>>8);
  2230. X        }
  2231. X|
  2232. X    STRING
  2233. X        {
  2234. X            cp = $1;
  2235. X            while (*cp != '\0')
  2236. X                emit(1,*cp++);
  2237. X        }
  2238. X|
  2239. X    expression
  2240. X        {
  2241. X            if ($1 < -128 || $1 > 255)
  2242. X                    err[vflag]++;
  2243. X            emit(1, $1 & 0377);
  2244. X        }
  2245. X;
  2246. X
  2247. X
  2248. Xdw.list:
  2249. X    dw.list.element
  2250. X|
  2251. X    dw.list ',' dw.list.element
  2252. X;
  2253. X
  2254. X
  2255. Xdw.list.element:
  2256. X    expression
  2257. X        {
  2258. X            emit(2, $1, $1>>8);
  2259. X        }
  2260. X;
  2261. X
  2262. X
  2263. X
  2264. Xlxexpression:
  2265. X    expression
  2266. X|
  2267. X    TWOCHAR
  2268. X;
  2269. X
  2270. Xparenexpr:
  2271. X    '(' expression ')'
  2272. X        {    $$ = $2;    }
  2273. X;
  2274. X
  2275. Xexpression:
  2276. X    error
  2277. X        {
  2278. X            err[eflag]++;
  2279. X            $$ = 0;
  2280. X        }
  2281. X|
  2282. X    LABEL
  2283. X        {    $$ = $1->i_value; $1->i_uses++ ;    }
  2284. X|
  2285. X    NUMBER
  2286. X|
  2287. X    ONECHAR
  2288. X|
  2289. X    EQUATED
  2290. X        {    $$ = $1->i_value;    }
  2291. X|
  2292. X    WASEQUATED
  2293. X        {    $$ = $1->i_value;    }
  2294. X|
  2295. X    DEFLED
  2296. X        {    $$ = $1->i_value;    }
  2297. X|
  2298. X    '$'
  2299. X        {    $$ = dollarsign;    }
  2300. X|
  2301. X    UNDECLARED
  2302. X        {
  2303. X            err[uflag]++;
  2304. X            $$ = 0;
  2305. X        }
  2306. X|
  2307. X    MULTDEF
  2308. X        {    $$ = $1->i_value;    }
  2309. X|
  2310. X    expression '+' expression
  2311. X        {    $$ = $1 + $3;    }
  2312. X|
  2313. X    expression '-' expression
  2314. X        {    $$ = $1 - $3;    }
  2315. X|
  2316. X    expression '/' expression
  2317. X        {    $$ = $1 / $3;    }
  2318. X|
  2319. X    expression '*' expression
  2320. X        {    $$ = $1 * $3;    }
  2321. X|
  2322. X    expression MOD expression
  2323. X        {    $$ = $1 % $3;    }
  2324. X|
  2325. X    expression '&' expression
  2326. X        {    $$ = $1 & $3;    }
  2327. X|
  2328. X    expression '|' expression
  2329. X        {    $$ = $1 | $3;    }
  2330. X|
  2331. X    expression '^' expression
  2332. X        {    $$ = $1 ^ $3;    }
  2333. X|
  2334. X    expression SHL expression
  2335. X        {    $$ = $1 << $3;    }
  2336. X|
  2337. X    expression SHR expression
  2338. X        {    $$ = (($1 >> 1) & 077777) >> ($3 - 1);    }
  2339. X|
  2340. X    '[' expression ']'
  2341. X        {    $$ = $2;    }
  2342. X|
  2343. X    NOT expression
  2344. X        {    $$ = ~$2;    }
  2345. X|
  2346. X    '+' expression %prec UNARY
  2347. X        {    $$ = $2;    }
  2348. X|
  2349. X    '-' expression %prec UNARY
  2350. X        {    $$ = -$2;    }
  2351. X;
  2352. X
  2353. Xsymbol:
  2354. X    UNDECLARED
  2355. X|
  2356. X    LABEL
  2357. X|
  2358. X    MULTDEF
  2359. X|
  2360. X    EQUATED
  2361. X|
  2362. X    WASEQUATED
  2363. X|
  2364. X    DEFLED
  2365. X;
  2366. X
  2367. X
  2368. Xal:
  2369. X    {
  2370. X        if (expptr >= MAXEXP)
  2371. X            error("Macro expansion level");
  2372. X        est2 = (char **) malloc((PARMMAX +4) * sizeof(char *));
  2373. X        expstack[expptr] = (char *)est2 ;
  2374. X        for (i=0; i<PARMMAX; i++)
  2375. X            est2[i] = 0;
  2376. X        arg_flag++;
  2377. X    }
  2378. X;
  2379. X
  2380. X
  2381. Xarg_on:
  2382. X    {    arg_flag++;    }
  2383. X;
  2384. X
  2385. Xarg_off:
  2386. X        {    arg_flag = 0;    }
  2387. X;
  2388. X
  2389. Xsetqf:
  2390. X        {    quoteflag++;    }
  2391. X;
  2392. X
  2393. Xclrqf:
  2394. X        {    quoteflag = 0;    }
  2395. X
  2396. X;
  2397. X
  2398. X%%
  2399. X/*extern int    yylval;*/
  2400. X
  2401. X#define F_END    0
  2402. X#define OTHER    1
  2403. X#define SPACE    2
  2404. X#define DIGIT    3
  2405. X#define LETTER    4
  2406. X#define STARTER 5
  2407. X
  2408. X
  2409. X/*
  2410. X *  This is the table of character classes.  It is used by the lexical
  2411. X *  analyser. (yylex())
  2412. X */
  2413. Xchar    charclass[] = {
  2414. X    F_END,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,
  2415. X    OTHER,    SPACE,    OTHER,    OTHER,    OTHER,    SPACE,    OTHER,    OTHER,
  2416. X    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,
  2417. X    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,
  2418. X    SPACE,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,
  2419. X    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,
  2420. X    DIGIT,    DIGIT,    DIGIT,    DIGIT,    DIGIT,    DIGIT,    DIGIT,    DIGIT,
  2421. X    DIGIT,    DIGIT,    OTHER,    OTHER,    OTHER,    OTHER,    OTHER,    STARTER,
  2422. X    STARTER,LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
  2423. X    LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
  2424. X    LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
  2425. X    LETTER, LETTER, LETTER, OTHER,    OTHER,    OTHER,    OTHER,    LETTER,
  2426. X    OTHER,    LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
  2427. X    LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
  2428. X    LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
  2429. X    LETTER, LETTER, LETTER, OTHER,    OTHER,    OTHER,    OTHER,    OTHER,
  2430. X};
  2431. X
  2432. X
  2433. X/*
  2434. X *  the following table tells which characters are parts of numbers.
  2435. X *  The entry is non-zero for characters which can be parts of numbers.
  2436. X */
  2437. Xchar    numpart[] = {
  2438. X    0,    0,    0,    0,    0,    0,    0,    0,
  2439. X    0,    0,    0,    0,    0,    0,    0,    0,
  2440. X    0,    0,    0,    0,    0,    0,    0,    0,
  2441. X    0,    0,    0,    0,    0,    0,    0,    0,
  2442. X    0,    0,    0,    0,    0,    0,    0,    0,
  2443. X    0,    0,    0,    0,    0,    0,    0,    0,
  2444. X    '0',    '1',    '2',    '3',    '4',    '5',    '6',    '7',
  2445. SHAR_EOF
  2446. echo "3" > ._seq_
  2447. -- 
  2448. "If I'd known it was harmless, I'd have killed it myself"  Phillip K. Dick
  2449. Bob Bownes, aka iii, aka captain comrade doktor bobwrench
  2450. 3 A Pinehurst Ave,    Albany, New York, 12203, (518)-482-8798 voice 
  2451.  bownesrm@beowulf.uucp {uunet!steinmetz,rutgers!brspyr1}!beowulf!bownesrm
  2452.